package br.com.admGearman.consulta.apresentacao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.event.ActionEvent;

import br.com.admGearman.cadastro.negocio.BandeiraNgc;
import br.com.admGearman.cadastro.negocio.EstEmpresaNgc;
import br.com.admGearman.cadastro.negocio.RedeAdquirenteNgc;
import br.com.admGearman.cadastro.vo.BandeiraVo;
import br.com.admGearman.cadastro.vo.EstEmpresaVo;
import br.com.admGearman.cadastro.vo.RedeAdquirenteVo;
import br.com.admGearman.cadastro.vo.filtro.FiltroControleLogBaixaVo;
import br.com.admGearman.consulta.negocio.ControleLogBaixaNgc;
import br.com.admGearman.consulta.vo.ControleLogBaixaVo;
import br.com.admGearman.util.Colecao;
import br.com.admGearman.util.jsf.AbstractBean;
import br.com.admGearman.util.jsf.JSFUtil;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.tipodado.Flag;
import br.com.r2.util.tipodado.Moeda;
import br.com.r2.util.tipodado.Texto;
import br.com.r2.util.tipodado.YesNo;

public class ControleLogBaixaBean extends AbstractBean<ControleLogBaixaVo, ControleLogBaixaNgc>
{

   private List<EstEmpresaVo> listaEmpresas;
   
   private List<RedeAdquirenteVo> listaRedeAdquirentes;
   
   private List<BandeiraVo> listaBandeiras;

   JSFUtil util = new JSFUtil();

   private Moeda valorTotalAPagar;

   private Moeda valorTotalPago;

   private Moeda valorTotalDiferenca;
   
   public ControleLogBaixaBean()
   {
      super(ControleLogBaixaNgc.getInstancia());
      this.ACTION_SEARCH = "controleLogBaixa";
      this.pageTitle = "titulo_controle_log_baixa";
   }
   
   @Override
   public String preparaPesquisar()
   {
      String retorno = super.preparaPesquisar();
      this.getSearchObject().setEstEmpresaVo(new EstEmpresaVo());
      this.getSearchObject().setRedeAdquirenteVo(new RedeAdquirenteVo());
      this.getSearchObject().setBandeiraVo(new BandeiraVo());
      this.getSearchObject().setFiltro(new FiltroControleLogBaixaVo());
      
      return retorno;
   }

   @Override
   protected void setListaPesquisa() throws R2Exception
   {
      setarListaEmpresas();
      setarListaRedeAdquirente();
      setarListaBandeiras();
   }

   private void setarListaBandeiras() throws R2Exception
   {
      this.listaBandeiras = new ArrayList<BandeiraVo>();
      BandeiraVo bandeiraVo = new BandeiraVo();
      bandeiraVo.setFlagAtivo(new Flag(YesNo.YES));
      List<BandeiraVo> lista = BandeiraNgc.getInstancia().pesquisar(bandeiraVo,0);

      BandeiraVo vazio = new BandeiraVo();
      vazio.setDescricao(new Texto("TODAS"));

      this.listaBandeiras.add(vazio);
      this.listaBandeiras.addAll(lista);
   }

   private void setarListaRedeAdquirente() throws R2Exception
   {
      this.listaRedeAdquirentes = new ArrayList<RedeAdquirenteVo>();
      RedeAdquirenteVo filtroRede = new RedeAdquirenteVo();
      filtroRede.setFlagAtivo(new Flag(YesNo.YES));
      List<RedeAdquirenteVo> listaRede = RedeAdquirenteNgc.getInstancia().pesquisar(filtroRede, 0);
      
      RedeAdquirenteVo vazio = new RedeAdquirenteVo();
      vazio.setDescricao(new Texto("TODAS"));
      
      this.listaRedeAdquirentes.add(vazio);
      this.listaRedeAdquirentes.addAll(listaRede);
   }

   private void setarListaEmpresas() throws R2Exception
   {
      this.listaEmpresas = new ArrayList<EstEmpresaVo>();
      List<EstEmpresaVo> listaEmp = EstEmpresaNgc.getInstancia().pesquisar(new EstEmpresaVo(), 0);
      
      EstEmpresaVo vazio = new EstEmpresaVo();
      vazio.setDescricao(new Texto("TODAS"));
      
      this.listaEmpresas.add(vazio);
      this.listaEmpresas.addAll(listaEmp);
   }
   
   @Override
   protected int getJoinPesquisar()
   {
      int join = ControleLogBaixaNgc.JOIN_EST_EMPRESA
                 | ControleLogBaixaNgc.JOIN_BANDEIRA
                 | ControleLogBaixaNgc.JOIN_ARQUIVO
                 | ControleLogBaixaNgc.JOIN_DATA_PAGAMENTO
                 | ControleLogBaixaNgc.JOIN_DATA_VENDA
                 | ControleLogBaixaNgc.JOIN_LOJA
                 | ControleLogBaixaNgc.JOIN_LOTE_BANDEIRA
                 | ControleLogBaixaNgc.JOIN_REDE;
      
      return join;
   }
   
   @Override
   protected void completarPesquisar() throws R2Exception
   {
      this.getSearchObject().getFiltro().setCodigoDataVendaInicial(null);
      this.getSearchObject().getFiltro().setCodigoDataVendaFinal(null);
      this.getSearchObject().getFiltro().setCodigoDataPagamentoInicial(null);
      this.getSearchObject().getFiltro().setCodigoDataPagamentoFinal(null);
   }
   
   @Override
   public void pesquisar(ActionEvent event)
   {
      super.pesquisar(event);
      // somarizando os totais
      if (this.getSearchResult() != null && this.getSearchResult().size() > 0)
      {
         double vlrPagar = Colecao.somaCampo(this.getSearchResult(), "ValorAPagar");
         double vlrPago = Colecao.somaCampo(this.getSearchResult(), "ValorPago");
         double vlrDiferenca = Colecao.somaCampo(this.getSearchResult(), "ValorDiferenca");
         
         valorTotalAPagar = new Moeda(vlrPagar);
         valorTotalPago = new Moeda(vlrPago);
         valorTotalDiferenca = new Moeda(vlrDiferenca);
      }
   }

   public List<EstEmpresaVo> getListaEmpresas()
   {
      return listaEmpresas;
   }

   public void setListaEmpresas(List<EstEmpresaVo> listaEmpresas)
   {
      this.listaEmpresas = listaEmpresas;
   }

   public List<BandeiraVo> getListaBandeiras()
   {
      return listaBandeiras;
   }

   public void setListaBandeiras(List<BandeiraVo> listaBandeiras)
   {
      this.listaBandeiras = listaBandeiras;
   }

   public List<RedeAdquirenteVo> getListaRedeAdquirentes()
   {
      return listaRedeAdquirentes;
   }

   public void setListaRedeAdquirentes(List<RedeAdquirenteVo> listaRedeAdquirentes)
   {
      this.listaRedeAdquirentes = listaRedeAdquirentes;
   }

   public Moeda getValorTotalAPagar()
   {
      return valorTotalAPagar;
   }

   public void setValorTotalAPagar(Moeda valorTotalAPagar)
   {
      this.valorTotalAPagar = valorTotalAPagar;
   }

   public Moeda getValorTotalPago()
   {
      return valorTotalPago;
   }

   public void setValorTotalPago(Moeda valorTotalPago)
   {
      this.valorTotalPago = valorTotalPago;
   }

   public Moeda getValorTotalDiferenca()
   {
      return valorTotalDiferenca;
   }

   public void setValorTotalDiferenca(Moeda valorTotalDiferenca)
   {
      this.valorTotalDiferenca = valorTotalDiferenca;
   }

}
